package org.example.aitest.utils.gen;

import org.example.aitest.dto.TableColumn;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class DynamicTableGenerator {
    private final JdbcTemplate jdbcTemplate;
    private final CodeGenerator codeGenerator; // 注入 CodeGenerator

    public DynamicTableGenerator(JdbcTemplate jdbcTemplate, CodeGenerator codeGenerator) {
        this.jdbcTemplate = jdbcTemplate;
        this.codeGenerator = codeGenerator;
    }

    /**
     * 动态创建表
     * 参数：1，表名， user
     * 2，字段集合 name,psw......
     * 3，表名注释 用户表
     * 4.是否生成服务，生成entity,service,mapper以及向同一个controller中修改添加数据
     * 5.采用第几个更新controller文件：目前提供1和2两种，第一种是通过excel生成并添加数据库后需要的更新
     *      第二种是用excel表和上一步添加数据库的excel表数据毕竟后形成的新表更新
     * */
    public void createTable(String rawTableName, List<TableColumn> columns,String name,Integer upController) {
        if (tableExists(rawTableName)) {
            return;
        }

        //清理表名
        String tableName = PinyinUtils.sanitizeTableName(rawTableName);

        StringBuilder sql = new StringBuilder();
        sql.append("CREATE TABLE ").append(tableName).append(" (\n");
        sql.append("  id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',\n");

        for (TableColumn column : columns) {

            // 处理列名
            String safeColumnName = PinyinUtils.sanitizeTableName(column.getName());

            sql.append(" ").append(safeColumnName).append(" ").append(column.getType());

            if("DECIMAL".equalsIgnoreCase(column.getType())) {
                sql.append("(").append(column.getLength()).append(",2)");
            }else if (column.getLength() > 0) {
                sql.append("(").
                    append(column.getLength()).append(")");
            }
            if (!column.getNullable()) {
                sql.append(" NOT NULL");
            }

            //添加注释
            if (column.getComment() != null && !column.getComment().isEmpty()) {
                sql.append(" COMMENT '").append(escapeSql(column.getComment())).append("'");
            }

            sql.append(",\n");
        }

        sql.append("  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n");
        sql.append("  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'\n");
        sql.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='").append(name).append("表'");

        jdbcTemplate.execute(sql.toString());

        // 2. 生成 Entity、Mapper、Service
        codeGenerator.generateCode(tableName, columns,upController);
    }

    // 转义SQL中的特殊字符
    private String escapeSql(String input) {
        return input.replace("'", "''");
    }

    /** * 检查表是否存在 */
    public boolean tableExists(String tableName) {
        String sql = "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_NAME = ?";
        Integer count = jdbcTemplate.queryForObject(sql, Integer.class, tableName);
        return count != null && count > 0;
    }
}